package visiopuce.graph;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseWheelListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Slider;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.XYPlot;

public class ChartScrollBar implements MouseListener, MouseWheelListener/*
																		 * AdjustmentListener
																		 * ,
																		 */
/* AxisChangeListener, MouseListener, DatasetChangeListener, MouseWheelListener */{
	private XYPlot plot;
	private double ratio;
	private boolean updating = false;
	private MyChartPanel cp;
	private int orientation;
	private Slider slider;
	private static int HSTEPS;

	public ChartScrollBar(int orientation, Composite composite, int style, JFreeChart chart, MyChartPanel cp) {
		this.slider = new Slider(composite, style);
		this.orientation = orientation;
		this.cp = cp;
		if (plot == null)
			this.plot = chart.getXYPlot();
		// else
		// this.plot = plot;
		// if (getXYPlot() != null && getValueAxis() != null) {
		// getValueAxis().addChangeListener(this);
		// /* addAdjustmentListener(this); */
		// if (getXYPlot().getDataset() != null)
		// getXYPlot().getDataset().addChangeListener(this);
		// axisUpdate();
		slider.addMouseListener(this);
	//	slider.addMouseWheelListener(this);
		// if (orientation != SWT.VERTICAL) {
		// slider.setValues((int)( plot.getDomainAxis().getLowerBound() +
		// (plot.getDomainAxis().getUpperBound() -
		// plot.getDomainAxis().getLowerBound()) / 2), (int)
		// plot.getDomainAxis().getLowerBound(), (int)
		// plot.getDomainAxis().getUpperBound(), slider.getThumb(),
		// (int)((plot.getDomainAxis().getUpperBound() -
		// plot.getDomainAxis().getLowerBound())/100),
		// (int)((plot.getDomainAxis().getUpperBound() -
		// plot.getDomainAxis().getLowerBound())/10));

		// Minimum((int) plot.getDomainAxis().getLowerBound());
		// slider.setMaximum((int) plot.getDomainAxis().getUpperBound());
		// // HSTEPS = (int) ((plot.getDomainAxis().getUpperBound() -
		// // plot.getDomainAxis().getLowerBound()));
		// // ratio = HSTEPS / ( cp.getMaxBoundX() - cp.getMinBoundX());
		// int newValue = (int) (slider.getSelection() * ratio);
		// getValueAxis().setRange(newValue, newValue + HSTEPS);
		// }
		// }
	}

	public XYPlot getXYPlot() {
		return plot;
	}

	public ValueAxis getValueAxis() {
		if (orientation == SWT.VERTICAL)

			return (ValueAxis) getXYPlot().getRangeAxis();
		// return (ValueAxis) (((XYPlot) ((CombinedDomainXYPlot)
		// getXYPlot()).getSubplots().get(1)).getRangeAxis());
		return (ValueAxis) getXYPlot().getDomainAxis();
	}

	//
	// public Dataset getDataset() {
	// return getXYPlot().getDataset();
	// }
	//
	// public Range getDataRange() {
	// if (orientation == SWT.VERTICAL) {
	// return (((XYPlot) ((CombinedDomainXYPlot)
	// getXYPlot()).getSubplots().get(1)).getDataRange(getValueAxis()));
	// } else {
	// return getXYPlot().getDataRange(getValueAxis());
	// }
	// }
	//
	// public double getDataMinimum() {
	// if (orientation == SWT.VERTICAL) {
	// return cp.getMinBoundY();
	// } else {
	// return cp.getMinBoundX();
	// }
	// }
	//
	// public double getDataMaximum() {
	// if (orientation == SWT.VERTICAL) {
	// return cp.getMaxBoundY();
	// } else {
	// return cp.getMaxBoundX();
	// }
	// }
	//
	// public double getViewMinimum() {
	// return getValueAxis().getLowerBound();
	// }
	//
	// public double getViewMaximum() {
	// return getValueAxis().getUpperBound();
	// }
	//
	// public double getViewLength() {
	// return getValueAxis().getRange().getLength();
	// }
	//
	// public double getDisplayMaximum() {
	// return getDataMaximum();// Math.max(getDataMaximum(), getViewMaximum());
	// }
	//
	// public double getDisplayMinimum() {
	// return getDataMinimum();// Math.min(getDataMinimum(), getViewMinimum());
	// }
	//
	// private double displayMin;
	// private double displayMax;
	// private double viewLength;
	// // 1000000 could be Integer.MAX_VALUE if
	// // you like, but this makes debugging a
	// // little easier
	// Color oldColor;
	//
	// public void axisUpdate() {
	//
	// HSTEPS = (int) ((plot.getDomainAxis().getUpperBound() -
	// plot.getDomainAxis().getLowerBound()));
	// VSTEPS = 300;
	// ValueAxis va = getValueAxis();
	// if (va.isAutoRange()) {
	// if (oldColor == null)
	// oldColor = slider.getBackground();
	// slider.setBackground(new Color(Display.getCurrent(), oldColor.getRed() +
	// 10, oldColor.getGreen() + 10, oldColor.getBlue() + 10));
	// } else if (oldColor != null) {
	// slider.setBackground(oldColor);
	// oldColor = null;
	// }
	// if (updating) {
	//
	// return;
	// }
	// updating = true;
	// displayMin = 0;
	// displayMax = 0;
	// viewLength = 0;
	// double viewMin = 0;
	// double viewMax = 0;
	// ratio = 1;
	// Range dataRange = getDataRange();
	// if (dataRange != null) {
	// displayMin = getDisplayMinimum();
	// displayMax = getDisplayMaximum();
	// viewMin = getViewMinimum();
	//
	// if (orientation == SWT.VERTICAL) {
	// viewMax = getViewMaximum();
	// } else {
	// viewMax = getViewMaximum();
	// }
	// viewLength = viewMax - viewMin;
	// if (orientation == SWT.VERTICAL) {
	// ratio = VSTEPS / (displayMax - displayMin);
	// } else {
	// ratio = HSTEPS / (displayMax - displayMin);
	// }
	// }
	//
	// int newMin = 0;
	// int newMax = 0;
	// if (orientation == SWT.VERTICAL) {
	// newMax = VSTEPS;
	// } else {
	// newMax = HSTEPS;
	// }
	//
	// int newExtent = (int) (viewLength * ratio);
	// int newValue;
	// if (orientation == SWT.VERTICAL) {
	// newValue = (int) ((viewMin - displayMin) * ratio);
	//
	// } else {
	// newValue = (int) ((viewMin - displayMin) * ratio);
	// }
	//
	// // System.out.println("ChartScrollBar.axisUpdate(): newValue: " +
	// // newValue + " newExtent: " + newExtent + " newMin: " + newMin +
	// // " newMax: " + newMax);
	//
	// // setValues(newValue, newExtent, newMin, newMax);
	// slider.setValues(newValue, newMin, newMax, newExtent,
	// slider.getIncrement(), slider.getPageIncrement());
	// if (getXYPlot() != null) {
	//
	// if (getValueAxis() != null && orientation == SWT.VERTICAL) {
	// // getValueAxis().setRange(viewMin, viewMin+15);
	// }
	// // if (getXYPlot().getRangeAxis() != null && orientation ==
	// SWT.HORIZONTAL) {
	// // getRangeAxis().setRange(newMin, newMax);
	// // }
	// }
	// updating = false;
	// }
	//
	public Slider getSlider() {
		return slider;
	}

	public void setSlider(Slider slider) {
		this.slider = slider;
	}

	//
	// //
	// // public void adjustmentValueChanged(AdjustmentEvent e) {
	// // if (updating)
	// // return;
	// // updating = true;
	// // double start, end;
	// // if (orientation == VERTICAL) {
	// // start = getValue() / ratio + displayMin;
	// // end = start + viewLength;
	// //
	// // } else {
	// // start = getValue() / ratio + displayMin;
	// // end = start + viewLength;
	// // }
	// //
	// // if (end > start) {
	// // getValueAxis().setRange(start, end);
	// // }
	// // updating = false;
	// // }
	// //
	// public void zoomFull() {
	// // getValueAxis().setAutoRange(true);
	// // getValueAxis().autoAdjustRange();
	// }
	//
	// public void mouseClicked(MouseEvent e) {
	// // if (e.getButton() == MouseEvent.BUTTON3) {
	// // zoomFull();
	// // }
	// }
	//
	// //
	// // public void mouseEntered(MouseEvent e) {
	// // }
	// //
	// // public void mouseExited(MouseEvent e) {
	// // }
	// //
	// // public void mousePressed(MouseEvent e) {
	// // }
	// //
	// // public void mouseReleased(MouseEvent e) {
	// // }
	// //
	// // @Override
	// // public void mouseWheelMoved(MouseWheelEvent e) {
	// // int rotation = e.getWheelRotation();
	// // setValue(getValue() + (getBlockIncrement(rotation) * rotation));
	// // }
	//
	// @Override
	// public void mouseScrolled(MouseEvent e) {
	// e.getSource();
	// // int rotation = e.getWheelRotation();
	// // slider.setValue(slider.getSelection() +
	// // (slider.getIncrement()(rotation) * rotation));
	// }
	//
	@Override
	public void mouseDoubleClick(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseDown(MouseEvent e) {
		// Range r = getValueAxis().getRange();
		// getValueAxis().setRange(slider.getSelection()-1,
		// slider.getSelection()+16);
	}

	@Override
	public void mouseUp(MouseEvent e) {
		// Range r = getValueAxis().getRange();
		if (orientation == SWT.VERTICAL) {
			getValueAxis().setRange(slider.getSelection() - 1, slider.getSelection() + 16);
		} else {
			HSTEPS = (int) ((plot.getDomainAxis().getUpperBound() - plot.getDomainAxis().getLowerBound()));
			// ratio = HSTEPS / (cp.getMaxBoundX() - cp.getMinBoundX());
			// int newValue = (int) (slider.getSelection() * ratio);
			// HSTEPS = slider.getMaximum() - slider.getMinimum();
			int min = Math.max(0, slider.getSelection() - HSTEPS / 2);
			int max = min + HSTEPS;
			getValueAxis().setRange(min, max);

		}
	}

	//
	// @Override
	// public void datasetChanged(DatasetChangeEvent event) {
	// axisUpdate();
	// }
	//
	// @Override
	// public void axisChanged(AxisChangeEvent event) {
	// axisUpdate();
	// }

	// @Override
	// public void axisChanged(AxisChangeEvent event) {
	// getValueAxis().setRange(slider.getSelection()-1,
	// slider.getSelection()+16);
	// }

	@Override
	public void mouseScrolled(MouseEvent e) {
		if (orientation == SWT.VERTICAL) {
			getValueAxis().setRange(slider.getSelection() - 1, slider.getSelection() + 16);
		}
	}
}
